package com.grupoconstruobras.sigo.security.audit;

import com.grupoconstruobras.sigo.core.ICoreNamingJndi;
import com.grupoconstruobras.sigo.core.context.ISessionContext;
import com.grupoconstruobras.sigo.data.BaseEntity;
import com.grupoconstruobras.sigo.security.audit.data.BaseAuditEntity;
import com.grupoconstruobras.sigo.security.audit.data.EmbeddableAuditEntity;
import com.grupoconstruobras.sigo.security.audit.data.GeneratorIdentifierAuditEntity;
import com.grupoconstruobras.sigo.security.audit.data.catalogue.BaseCatalogueAuditEntity;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.logging.Logger;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;

public class AuditorEntityListener implements IAuditorEntityListener {
	
	private static Logger LOG = Logger.getLogger(AuditorEntityListener.class.getName());
	//@Inject
	private ISessionContext ctx;

	@PreUpdate
	@PrePersist
	public void audit(Object bean) {
		ISessionContext ctx = null;
		try {
			Context jndi = new InitialContext();
			ctx = (ISessionContext) jndi.lookup(ICoreNamingJndi.GLOBAL + "sessionContext!" + ISessionContext.class.getName());
		} catch (NamingException e) {
			LOG.severe(e.getMessage());
		}
		
		String user = ctx.getPrincipal().getName();
		if (bean instanceof EmbeddableAuditEntity) {
	    	EmbeddableAuditEntity entity = (EmbeddableAuditEntity) bean;
	    	entity.setUsuario(user);
			entity.setIp(ctx.getIpAddress());
			entity.setIpToEmbeddable(ctx.getIpAddress());
			entity.setUsuarioToEmbeddable(user);
	    } else if (bean instanceof BaseEntity) {
			BaseAuditEntity entity = (BaseAuditEntity) bean;
			entity.setUsuario(user);
			entity.setIp(ctx.getIpAddress());
			log(user);
	    } else if (bean instanceof GeneratorIdentifierAuditEntity) {
			GeneratorIdentifierAuditEntity entity = (GeneratorIdentifierAuditEntity) bean;
			entity.setUsuario(user);
			entity.setIp(ctx.getIpAddress());
			log(user);
	    } else if (bean instanceof BaseCatalogueAuditEntity) {
	    	BaseCatalogueAuditEntity entity = (BaseCatalogueAuditEntity) bean;
			entity.setUsuario(user);
			entity.setIp(ctx.getIpAddress());
			log(user);
	    } 
	}
	
	private void log(String user) {
		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		String date = format.format(Calendar.getInstance().getTime());
		LOG.info(String.format("Registro creado por el usuario %s, con fecha %s", user, date));
	}
	
}
